home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / ISSUE09 / FILES / NETLOCK.PAS < prev    next >
Pascal/Delphi Source File  |  1996-04-09  |  3KB  |  100 lines

  1. unit NetLock;
  2.  
  3. interface
  4.  
  5. uses
  6.   WinTypes, WinProcs;
  7.  
  8. { Core routines that mimic Win32 parameter set }
  9. {$ifndef Win32}
  10. function LockFile(Handle: Integer; FileOffsetLow, FileOffsetHigh,
  11.                   LockBytesLow, LockBytesHigh: Integer): Bool;
  12. function UnlockFile(Handle: Integer; FileOffsetLow, FileOffsetHigh,
  13.   LockBytesLow, LockBytesHigh: Integer): Bool;
  14. {$endif}
  15. { Handle based routine that un/locks a given number of bytes }
  16. function LockFileArea(Handle: Integer; FileOffset, LockBytes: Longint;
  17.                       Unlock: Boolean): Bool;
  18. { File variable based routine that un/locks a given number of records }
  19. function LockFileVarArea(var FileVar; RecordNumber, NumRecords: Longint;
  20.                          Unlock: Boolean): Bool;
  21. { File variable based routine that un/locks one record }
  22. function LockFileVar(var FileVar; RecordNumber: Longint;
  23.                      Unlock: Boolean): Bool;
  24.  
  25. implementation
  26.  
  27. uses
  28.   SysUtils;
  29.  
  30. {$ifndef Win32}
  31. { Core routines that mimic Win32 parameter set }
  32. function LockFile(Handle: Integer; FileOffsetLow, FileOffsetHigh,
  33.   LockBytesLow, LockBytesHigh: Integer): Bool; assembler;
  34. asm
  35.   mov ah, $5C
  36.   mov al, 0
  37.   mov bx, Handle
  38.   mov cx, FileOffsetHigh
  39.   mov dx, FileOffsetLow
  40.   mov si, LockBytesHigh
  41.   mov di, LockBytesLow
  42.   int $21
  43.   jnc @1
  44.   xor ax, ax
  45.   jmp @2
  46.  @1:
  47.   mov ax, 1
  48.  @2:
  49. end;
  50.  
  51. function UnlockFile(Handle: Integer; FileOffsetLow, FileOffsetHigh,
  52.   LockBytesLow, LockBytesHigh: Integer): Bool; assembler;
  53. asm
  54.   mov ah, $5C
  55.   mov al, 1
  56.   mov bx, Handle
  57.   mov cx, FileOffsetHigh
  58.   mov dx, FileOffsetLow
  59.   mov si, LockBytesHigh
  60.   mov di, LockBytesLow
  61.   int $21
  62.   jnc @1
  63.   xor ax, ax
  64.   jmp @2
  65.  @1:
  66.   mov ax, 1
  67.  @2:
  68. end;
  69. {$endif}
  70.  
  71. { Handle based routine that un/locks a given number of bytes }
  72. function LockFileArea(Handle: Integer; FileOffset, LockBytes: Longint;
  73.                       Unlock: Boolean): Bool;
  74. begin
  75.   if not Unlock then
  76.     Result := LockFile(Handle, LoWord(FileOffset),
  77.       HiWord(FileOffset), LoWord(LockBytes), HiWord(LockBytes))
  78.   else
  79.     Result := UnlockFile(Handle, LoWord(FileOffset),
  80.       HiWord(FileOffset), LoWord(LockBytes), HiWord(LockBytes));
  81. end;
  82.  
  83. { File variable based routine that un/locks a given number of records }
  84. function LockFileVarArea(var FileVar; RecordNumber, NumRecords: Longint;
  85.                          Unlock: Boolean): Bool;
  86. begin
  87.   with TFileRec(FileVar) do
  88.     Result := LockFileArea(Handle, Recordnumber * RecSize,
  89.                            NumRecords * RecSize, Unlock);
  90. end;
  91.  
  92. { File variable based routine that un/locks one record }
  93. function LockFileVar(var FileVar; RecordNumber: Longint;
  94.                         Unlock: Boolean): Bool;
  95. begin
  96.   Result := LockFileVarArea(FileVar, RecordNumber, 1, Unlock);
  97. end;
  98.  
  99. end.
  100.